#include <mips/regdef.h>
#include <sys/syscall.h>
#ifndef 	fp
#define	fp	$fp
#endif
#define SSIZE			(32)
#define	O_RA			(24)
#define	O_FP			(20)
#define	O_GP			(16)
#define 	O_ARG0		(SSIZE)
#define 	O_ARG1		((SSIZE) + 4)
#define 	O_ARG2		((SSIZE) + 8)

	.text
	.align 	2
	.globl	leer
	.ent	leer

leer:
   	.frame fp,32, ra
   	.set  noreorder
   	.cpload  t9
   	.set  reorder

		subu	sp,sp,SSIZE
		sw		gp,O_GP(sp)
		sw		fp,O_FP(sp)
		sw		ra,O_RA(sp) 
		move	fp,sp
		sw		a0,O_ARG0(fp)
		sw		a1,O_ARG1(fp)
		sw		a2,O_ARG2(fp)
		li		v0,SYS_read
		lw		a0,O_ARG0(fp)
		lw		a1,O_ARG1(fp)
		lw		a2,O_ARG2(fp)
		syscall
		bne	a3,zero,error_lectura
		b		finalizar_lectura

error_lectura:
		li		v0,-1

finalizar_lectura:
		move	sp,fp		# destruyo stack frame
		lw		gp,O_GP(sp)
		lw		fp,O_FP(sp)
		lw		ra,O_RA(sp) 
		addiu	sp,sp,SSIZE
		jr		ra
		.end		leer

		/* ssize_t	escribir(int,const void*,size_t)	*/
		.text
		.align 	2
		.globl	escribir
		.ent	escribir

escribir:
   	.frame fp,32, ra
   	.set  noreorder
   	.cpload  t9
   	.set  reorder

		subu	sp,sp,SSIZE
		sw		gp,O_GP(sp)
		sw		fp,O_FP(sp)
		sw		ra,O_RA(sp) 
		move	fp,sp
		sw		a0,O_ARG0(fp)
		sw		a1,O_ARG1(fp)
		sw		a2,O_ARG2(fp)
		li		v0,SYS_write
		lw		a0,O_ARG0(fp)
		lw		a1,O_ARG1(fp)
		lw		a2,O_ARG2(fp)
		syscall
		bne	a3,zero,error_escritura
		b	finalizar_escritura

error_escritura:
		li		v0,-1

finalizar_escritura:
		move	sp,fp		# destruyo stack frame
		lw		gp,O_GP(sp)
		lw		fp,O_FP(sp)
		lw		ra,O_RA(sp)
		addiu	sp,sp,SSIZE
		j		ra
		.end escribir
